#if !defined(CAMERA_HPP)
#define CAMERA_HPP

#include "Eigen"

#include "Ray.hpp"

class Camera {
private:
    // 相机所处原点
    Eigen::Vector3f orig;
    // 画面左下角在空间中的坐标
    Eigen::Vector3f lowLeftCorner;
    // 指示画面右边
    Eigen::Vector3f horizontal;
    // 指示相机正上方
    Eigen::Vector3f vertical;
    // 张角（垂直）（角度）
    float eyeFov = 90;
    // 光圈大小
    float apertureRadius;
    // 向右x，向上y，向后-z
    Eigen::Vector3f u, v, w;

public:
    /**
     * @param eyeFov 垂直方向的视场大小，用角度制度
     * @param aspectRatio 长宽比，长/宽，默认16/9
     * */
    Camera(float eyeFov = 90, float aspectRatio = 1.778);
    /**
     * @param origin 相机位置，视线发射起点
     * @param lookAt 相机对准的位置
     * @param viewUp 世界坐标下垂直向上位置，world-up
     * @param eyeFov 垂直方向的视场大小，用角度制度
     * @param aspectRatio 长宽比，长/宽，默认16/9
     * @param apertureRadius 光圈半径，默认是0，即完美的小孔成像
     * @param focalDist 焦距
     * */
    Camera(
        const Eigen::Vector3f& origin,
        const Eigen::Vector3f& lookAt,
        const Eigen::Vector3f& viewUp,
        float eyeFov = 90,
        float aspectRatio = 1.778,
        float apertureRadius = 0,
        float focalDist = 1
    );
    ~Camera();
    // 通过矩阵变换来移动视角
    void transform(const Eigen::Matrix4f& trans);
    // uv都在[0,1]中
    Ray get_ray(float u, float v)const;
    // uv都在[0,1]中
    Ray get_ray(Eigen::Vector2f uv)const;
    void set_eyeFov(float fov);
    void set_aspect_ratio(float ratio);
};

#endif // CAMERA_HPP
